package com.xbongbong.saas.enums.base;

import com.xbongbong.saas.enums.dictionary.PaymentStatusEnum;
import lombok.Getter;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 应收款字段attr基础枚举
 * 如果非经销商、经销商类模板都有的字段，则需在该基础枚举内维护attr
 * @author zcp
 */
@Getter
public enum PaymentBaseEnum {
    /**
     * 基本信息
     */
    BASE_INFO("other_1"),
    PAYMENT_NO("serialNo"),

    AMOUNT("num_1"),
    REAL_AMOUNT("num_2"),
    UN_AMOUNT("num_3"),
    RED_AMOUNT("num_61"),
    //TODO 子表单不允许扩展日期类型字段，最大到20，因此暂时先用20
    GENERATION_DATE("date_20"),
    RECEIVABLE_PERIOD("text_81"),
    ESTIMATE_TIME("date_1"),
    SOURCE("text_82"),
    CUSTOMER("text_4"),
    CONTRACT("text_5"),
    BAD_AMOUNT("num_8"),
    INVOICE_AMOUNT("num_4"),
    STATUS("text_3"),
    BELONGER("text_12"),
    PAYMENT_METHOD("text_13"),
    PAYMENT_TYPE("text_6"),
    MEMO("text_7"),
    // 系统信息
    SYSTEM_INFO("other_2"),
    CREATOR_ID("creatorId"),
    ADD_TIME("addTime"),
    UPDATE_TIME("updateTime"),
    ADD_PAYMENT("array_31"),
    OWNER_ID("ownerId"),
    COUSERID("coUserId"),
    //下单人，long类型是系统预留，总计10个，不会开放给用户
    ORDERER_ID("long_1"),
    ORDERER("text_85"),
    REAL_PAY_TIME("date_2"),
    /**
     * 原回款计划根据回款单会有红冲回款计划,资金三期 原回款计划变为 应收款,又加入红冲应收款,与原来的红冲回款计划无关
     * @author yuqian
     */
    IS_RED("num_5"),
    HAS_RED("num_6"),
    /**
     * 一期前存在红冲，和三期的红冲 应收款概念不一样，加上一个标记隔离开
     */
    RECEIVABLE_IS_RED("num_62"),
    RECEIVABLE_HAS_RED("num_63"),
    //没有用了可以删掉
    REF_TYPE("num_7"),
    //关联单据业务类型
    SOURCE_REF_TYPE("num_64"),
    //没用
    ORIGIN_ID("text_8"),
    RECEIVABLES_ORIGIN_ID("text_84"),
    CUSTOMER_LINK_TEXT("text_10"),
    CONTRACT_LINK_TEXT("text_11"),
    UNIT("text_2"),

    RECEIVABLES_ORIGIN_LINK_TEXT("text_63"),
    //关联单据编号
    SOURCE_LINK_TEXT("text_83"),
    ;

    private final String attr;

    PaymentBaseEnum(String attr) {
        this.attr = attr;
    }

    /**
     * 获取应收款不可编辑字段
     * 应收款除了红冲，无主动新增入口（通过应收规则自动生成）
     * @param paymentStatusEnum 应收款状态
     * @return java.util.List<java.lang.String>
     * @since v1.0
     * @version v1.0
     */
    public static List<String> getUnableEditAttrList(PaymentStatusEnum paymentStatusEnum) {
        switch (paymentStatusEnum) {
            case RECEIVABLES:
            case PARTIAL_RECEIPTS:
                return Arrays.asList(HAS_RED.attr, PAYMENT_NO.attr, CUSTOMER.attr, CONTRACT.attr, CONTRACT.attr, AMOUNT.attr, STATUS.attr);
            case BAD_DEBT:
            case PARTIAL_BAD_DEBT:
                return Arrays.asList(HAS_RED.attr, PAYMENT_NO.attr, CUSTOMER.attr, CONTRACT.attr, CONTRACT.attr, AMOUNT.attr, STATUS.attr, ESTIMATE_TIME.attr);
            default:
                return Arrays.asList(HAS_RED.attr);
        }
    }
    /**
     * 封装应收款各个状态不允许编辑的字段
     * @return java.util.Map<java.lang.String,java.util.List<java.lang.String>>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public static Map<String, List<String>> getUnableEditAttrMap() {
        List<PaymentStatusEnum> enumList = Arrays.asList(PaymentStatusEnum.values());
        //状态code - 该状态禁止编辑的字段attrList
        Map<String, List<String>> unableEditAttrMap = new HashMap<>(enumList.size());
        for (PaymentStatusEnum statusEnum : enumList) {
            //各个状态不允许编辑的字段list
            List<String> paymentUnableEditAttrList = getUnableEditAttrList(statusEnum);
            unableEditAttrMap.put(statusEnum.getCode(), paymentUnableEditAttrList);
        }
        return unableEditAttrMap;
    }
}
